#include "timer.hpp"

void Timer_Queue::init_timer_queue(){
    update_time();
}

void Timer_Queue::update_time(){
    struct timeval cur_time_val;            
    gettimeofday(&cur_time_val, nullptr);   // 获取当前时间
    current_msec = ((cur_time_val.tv_sec * 1000) + (cur_time_val.tv_usec / 1000));
    // 这个时间是从1970年0点0分开始算
    // size_t非常之大，不用考虑溢出问题
}

void Timer_Queue::add_timer(HTTP_Request *_req){
    update_time();
    // 创建新的timer
    Timer* timer_node = new Timer(current_msec + TIMEOUT_DEFAULT, _req);
    timer_queue.push(timer_node);
    _req->set_timer_node(timer_node);
}

// 删除timer
// 当接收到请求时，删除request对于的timer
// 只将其暂标为已删除（惰性删除）
void Timer_Queue::delete_timer(HTTP_Request* _req){
    update_time();  // 这里为什么要更新？
    _req->get_timer_node()->del_timer();
}

void Timer_Queue::handle_expire_timers(){
    while(timer_queue.empty() == false){
        update_time();
        Timer *tmp = timer_queue.top();
        if(tmp->is_deleted()){
            timer_queue.pop();
            delete tmp;
            continue;
        }

        // 如果当前队首（最早入队的结点）依旧没有超时, 则返回。
        if(tmp->get_expire_time() > current_msec){
            return;
        }
        // 否则关闭此链接.
        else{
            tmp->close_connection();
            delete tmp;
        }
    }
}

// 获取队列种最早的时间和当前之间的差
int Timer_Queue::find_timer(){
    int time;
    while(!timer_queue.empty()){
        update_time();
        Timer *tmp = timer_queue.top();
        if(tmp->is_deleted()){
            delete tmp;
            continue;
        }
        time = (int)(tmp->get_expire_time() - current_msec);
        time = (time > 0) ? time : 0;
        break;
    }
    return time;
}